package com.briup.client;

import com.briup.Configuration;
import com.briup.client.Gather;
import com.briup.entity.Environment;
import com.briup.support.ConfigurationAware;
import com.briup.support.PropertiesAware;
import com.briup.util.Log;
import com.briup.util.LogImpl;

import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;

public class GatherImpl implements Gather, PropertiesAware, ConfigurationAware {

    private String fileName;
    private Log log;

    @Override
    public Collection<Environment> gather() throws Exception {
//        最终要返回的结果
        ArrayList<Environment> list = new ArrayList<>();
//        创建包装流 BufferedReader 一行一行的去读取数据
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        //创建String类型的变量 读取数据
        String line = null;
        //一直读取数据  直到文件末尾
        while ((line = br.readLine()) != null) {
// 将读取到的数据 进行分割
            String[] arr = line.split("[|]");
            Environment e1 = new Environment();
            //将采集到的数据进行整合 变成对象
            if (!"1".equals(arr[7])) {
                throw new RuntimeException("遇到非法数据");
            } else {
                e1.setSrcId(arr[0]);
                e1.setDescId(arr[1]);
                e1.setDevId(arr[2]);
                //字符串 转  int
                e1.setCount(Integer.parseInt(arr[4]));
                e1.setCmd(arr[5]);
                e1.setStatus(Integer.parseInt(arr[7]));
                e1.setGatherDate(new Timestamp(Long.parseLong(arr[8])));
                //处理个性数据  就是根据数据的第四部分 进行环境数据的种类区分 以及数据计算
                if ("16".equals(arr[3])) {
                    //对象拷贝
                    Environment e2 = e1.clone();
                    e1.setName("温度");
                    //截取前两个字节 进行进制转换
                    int tempVal = Integer.parseInt(arr[6].substring(0, 4), 16);
                    //套用计算公式
                    e1.setData(tempVal * (0.00268127F) - 46.85F);

                    e2.setName("湿度");
                    //截取中间两个字节 进行进制转换
                    int humVal = Integer.parseInt(arr[6].substring(4, 8), 16);
                    //套用计算公式
                    e2.setData(humVal * 0.00190735F - 6);
                    list.add(e2);
                } else if ("256".equals(arr[3])) {
                    e1.setName("光照强度");
                    e1.setData(Integer.parseInt(arr[6].substring(0, 4), 16));
                } else if ("1280".equals(arr[3])) {
                    e1.setName("二氧化碳");
                    e1.setData(Integer.parseInt(arr[6].substring(0, 4), 16));
                }
                list.add(e1);
                log.info("采集到的数据条数：" + list.size());
            }
        }
        return list;
    }

    @Override
    public void init(Properties properties) throws Exception {
        fileName = properties.getProperty("fileName");
    }

    @Override
    public void setConfiguration(Configuration configuration) throws Exception {
        log=configuration.getLogger();
    }
}
